package com.dm.service;

import com.dm.dto.FileAttributeDto;
import com.dm.dto.FilesDto;
import com.dm.dto.ResponseDto;
import com.dm.dto.input.FileDto;
import com.dm.dto.input.FileSearchDto;
import com.dm.dto.input.UserDto;

import java.io.File;
import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * @author hqw521@qq.com
 * @date 2018/11/16 15:53
 */
public interface FileService {
    /**
     * 在服务器上创建一个新文件
     *
     * @param fileDto 文件信息
     * @return 提示信息
     */
    ResponseDto createFile(FileDto fileDto);

    /**
     * 将文件上传到服务器
     *
     * @param file            要上传的文件
     * @param fileName        文件名
     * @param fileContentType 文件类型
     * @param folderPath      文件路径
     * @return 文件的绝对路径和相对路径
     */
    ResponseDto<Map<String, String>> uploadFile(File file, String fileName, String fileContentType, String folderPath);

    /**
     * 将上传的文件信息存储到数据库
     *
     * @param fileDto 文件信息
     * @return 提示信息
     */
    ResponseDto addFile(FileDto fileDto);

    /**
     * 查询用户的文件
     *
     * @param userDto 用户信息
     * @return 文件信息
     */
    ResponseDto<List> findFiles(UserDto userDto);

    /**
     * 查询文件夹下的文件
     *
     * @param userId   用户ID
     * @param folderId 文件夹ID
     * @return 文件列表
     */
    ResponseDto<List> findFilesByFolder(Integer userId, Integer folderId);

    /**
     * 文件重命名
     *
     * @param fileDto 文件ID和文件名
     * @return 提示信息
     */
    ResponseDto fileRename(FileDto fileDto);

    /**
     * 批量删除文件
     *
     * @param userId            用户ID
     * @param ids               文件ID
     * @param fileRelativePaths 文件相对路径
     * @return 提示信息
     */
    ResponseDto deleteFiles(Integer userId, String[] ids, String[] fileRelativePaths);

    /**
     * 查询要删除的文件名
     *
     * @param ids 文件ID数组
     * @return 提示信息
     */
    List<String> findFileName(String[] ids);

    /**
     * 文件搜索
     *
     * @param fileSearchDto 文件查询条件
     * @return 文件列表
     */
    ResponseDto<List<FilesDto>> fileSearch(FileSearchDto fileSearchDto);

    /**
     * 查询文件属性
     *
     * @param fileId 文件ID
     * @return 文件属性
     */
    ResponseDto<FileAttributeDto> findFileAttribute(Integer fileId);

    /**
     * 更新文件点击次数
     *
     * @param fileId 文件ID
     */
    void updateClickNum(Integer fileId);

    /**
     * 多文件下载
     *
     * @param ids
     * @return
     */
    InputStream downloadMultiFile(String[] ids);
}
